package cifrador.des;

import java.awt.CardLayout;
import java.util.*;
import javax.swing.JPanel;


public class PInicio extends javax.swing.JPanel {
    String clave;
    CifradorDES cifrador= new CifradorDES();
    StringBuilder[] K= new StringBuilder[16]; //Las claves
    StringBuilder textoOriginal= new StringBuilder();
    StringBuilder textocifradoTotal;
    JPanel intro;
    
    /** Creates new form PInicio */
    public PInicio() {
        initComponents();
        
    }

    PInicio(JPanel intro) {
        this.intro=intro;
         initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jClave = new javax.swing.JTextField();
        jButtonClave = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextAreaResultado = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jTextoPlano = new javax.swing.JTextField();
        botonDesencriptar = new javax.swing.JButton();

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        setMaximumSize(new java.awt.Dimension(600, 600));
        setMinimumSize(new java.awt.Dimension(433, 291));
        setPreferredSize(new java.awt.Dimension(600, 600));

        jLabel1.setText("Agregue el mensaje:");

        jClave.setText("Encripta");
        jClave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jClaveActionPerformed(evt);
            }
        });

        jButtonClave.setText("INICIAR");
        jButtonClave.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonClaveActionPerformed(evt);
            }
        });

        jTextAreaResultado.setColumns(20);
        jTextAreaResultado.setRows(5);
        jScrollPane2.setViewportView(jTextAreaResultado);

        jLabel2.setText("Agregue la clave a encriptar y se generarán las 16 claves a utilizar.");

        jLabel3.setText("Agregue la clave:");

        jTextoPlano.setText("Cifrado");
        jTextoPlano.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextoPlanoActionPerformed(evt);
            }
        });

        botonDesencriptar.setText("DESENCRIPTAR");
        botonDesencriptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonDesencriptarActionPerformed(evt);
            }
        });
        this.botonDesencriptar.setEnabled(false);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 580, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jLabel3)
                                    .addComponent(jLabel1))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jClave, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jTextoPlano, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE))))
                        .addGap(52, 52, 52)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(botonDesencriptar, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE)
                            .addComponent(jButtonClave, javax.swing.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE))
                        .addGap(67, 67, 67)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel3))
                        .addGap(13, 13, 13)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextoPlano, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButtonClave, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonDesencriptar)))
                .addGap(13, 13, 13)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 486, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents
   
        
    private void jButtonClaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonClaveActionPerformed
         
        this.botonDesencriptar.setEnabled(true);
      /************************************************************************************/
      /***********************Trabajo con las claves*********************************/
     /************************************************************************************/
        
        clave=jClave.getText().toString();
        
       jTextAreaResultado.append("\n"+"//////////////////Generación de claves/////////////////"+"\n");
       jTextAreaResultado.append("Clave: "+clave+"\n");
        StringBuilder claveBinario= cifrador.aBinario(clave);
        generaClaves(claveBinario);
       
       /************************************************************************************/
       /***********************Trabajo con TextoPlano ahora*********************************/
       /************************************************************************************/
       
   
       String texto= this.jTextoPlano.getText().toString();
       StringBuilder textoBinario= new StringBuilder(cifrador.aBinario(texto)); //Declarado para no perder los datos
    
       
       StringBuilder[] bloques= cifrador.creaBloque(textoBinario);
       StringBuilder armandoCBC[]= new StringBuilder[bloques.length];
       StringBuilder IV= new StringBuilder(64);
       for(int i=0;i<64;i++){
         IV.append(0);      
       }
       
       this.textocifradoTotal= new StringBuilder(bloques.length*64); //Reservo la memoria necesaria para llenar esto
       //Ciclo CBC
       //Ciclo CBC
       for(int i=0; i<bloques.length;i++){
      
       jTextAreaResultado.append("\n"+"//////////////////Codificación Texto Plano/////////////////"+"\n");
       jTextAreaResultado.append("Bloque "+(i+1)+" : "+bloques[i]+"\n");
       if(i==0){
       armandoCBC[i]= new StringBuilder(encriptaDES(cifrador.funcionXOR(bloques[i], IV)));
       this.textocifradoTotal.append(armandoCBC[i].toString());
       }
       else{
       armandoCBC[i]= new StringBuilder(encriptaDES(cifrador.funcionXOR(bloques[i],armandoCBC[i-1])));
       this.textocifradoTotal.append(armandoCBC[i].toString());
       }
       }
       
    jTextAreaResultado.append("\n"+"//////////////////Texto cifrado/////////////////"+"\n\n"+
            textocifradoTotal);
      
      
    }//GEN-LAST:event_jButtonClaveActionPerformed
  
    
    public StringBuilder encriptaDES(StringBuilder textoPlano){
      StringBuilder[] mitades= new StringBuilder[2];
      StringBuilder textocifrado= new StringBuilder();
      
       for(int i=0;i<16;i++){
           if(i==0){
              
             //Realizo PI sobre texto Plano
             textoPlano= cifrador.permutacionInicial(textoPlano);
             jTextAreaResultado.append("PI de largo "+ textoPlano.length()+" : "
                +cifrador.imprimirPantalla(textoPlano,8) +"\n"); 
                      
               //Se crea lado derecho y izquierdo (Ri y Li), ambos de 32 bits.
               mitades= cifrador.cortaMitad(textoPlano);
               mitades= cicloDES(mitades,i);
           }
           else{
               
           
                if(i==15){
                mitades=cicloDES(mitades,i);
                jTextAreaResultado.append("\n****\nR: "+cifrador.imprimirPantalla(mitades[0],8) +
                      "\nL: "+cifrador.imprimirPantalla(mitades[1],8)+"\n"); 
                textocifrado= new StringBuilder();
                textocifrado.append(mitades[1].toString());
                textocifrado.append(mitades[0].toString());
                jTextAreaResultado.append("\n------\nunido: "+cifrador.imprimirPantalla(textocifrado,8)+"\n"); 
                textocifrado= cifrador.permutacionFinal(textocifrado); 
              
                /*PONER PERMUTACION FINAL AQUI*/
                jTextAreaResultado.append("PF de largo "+ textocifrado.length()+" : "
                    +cifrador.imprimirPantalla(textocifrado,8) +"\n"); 
                }
                else{
                
                mitades=cicloDES(mitades,i);
                }
           }
        }
       return textocifrado;
     }
    
     public StringBuilder[] cicloDES(StringBuilder[] mitades, int ciclo){
        
         jTextAreaResultado.append("Ciclo n°"+(ciclo+1)+": \n");
        
         StringBuilder Ri,Li;
         Li= new StringBuilder(mitades[0]);
         Ri= new StringBuilder(mitades[1]);
         jTextAreaResultado.append("Ri: "+cifrador.imprimirPantalla(Ri,4)+"\nLi: "+cifrador.imprimirPantalla(Li,4)+"\n");
         
        /*Operaciones sobre lado derecho*/
        //Expansion de 32 a 48 bits de lado derecho.
        Ri= cifrador.textoExpansion(Ri);
        jTextAreaResultado.append("Texto Expansion: "+ Ri.length()+" : "
                     +cifrador.imprimirPantalla(Ri,6) +"\n");
        
       // Lado derecho XOR K[i], donde i=ronda actual
        Ri= cifrador.funcionXOR(Ri, this.K[ciclo]);
        jTextAreaResultado.append("Ri XOR K[i]: "+ Ri.length()+" : "+
                cifrador.imprimirPantalla(Ri,6) +"\n");
        
       //Caja sustitucion
        Ri= cifrador.cajaS(Ri);
        jTextAreaResultado.append("CajaS: "+ Ri.length()+" : "+
                cifrador.imprimirPantalla(Ri,4) +"\n");
        
        //Caja permutacion
        Ri= cifrador.cajaP(Ri);
         jTextAreaResultado.append("CajaP: "+ Ri.length()+" : "+
                cifrador.imprimirPantalla(Ri,4) +"\n");
       
       /* Finalmente: Lado izquierdo XOR Lado derecho operado.*/
         jTextAreaResultado.append("Ri: "+cifrador.imprimirPantalla(Ri,4)+"\nLi: "+cifrador.imprimirPantalla(Li,4)+"\n");
         
           Ri= cifrador.funcionXOR(Ri,Li);
          jTextAreaResultado.append("Li-1 XOR Ri: "+ Ri.length()+" : "+
                cifrador.imprimirPantalla(Ri,4) +"\n\n");
      
       
          StringBuilder[] salida= new StringBuilder[2];
          salida[0]= new StringBuilder(mitades[1]); //El antiguo R
          salida[1]= new StringBuilder(Ri);  //El actual R
         
          return salida;
          
          
    }
     
     
      public void generaClaves(StringBuilder claveBinario){
         
       StringBuilder temp= new StringBuilder(claveBinario);
        temp= cifrador.borrarUltimobit(temp,8);
        temp= cifrador.colocaEspacio(temp,7);
        temp= cifrador.permutacionPC1(temp);
      //Luego de PC1 se debe borrar los ultimos 8 bits, y ESTO ES ASI.
       temp= cifrador.borrarUltimobit(temp,8);  
      
       
       /*Realizo todas las rondas, se generan las casi-llaves de 56bits, no se borra nada*/ 
    
       for(int i=0;i<16;i++){
         if(i==0){
           K[0]= cifrador.desplazar(temp,0);}
         else{
           K[i]=cifrador.desplazar(K[i-1],i);}
       }
       
       /*Realizo permutacion PC2 en todas las casi-llaves, se obtienen las llaves de 56bits*/
       for(int i=0; i<16; i++){
         K[i]= cifrador.permutacionPC2(K[i]);
       }
       
    
     /* Cada K[i] debe tener 48 bits. Asi que se borra el septimo bit*/
       for(int i=0; i<16; i++){
            K[i]=cifrador.borrarUltimobit(K[i],7);
       }
       
       /*Imprimo por Interfaz. */
       for(int i=0; i<16;i++){
       jTextAreaResultado.append("K"+(i+1)+" :"+K[i]+"\n");
       }
   
   
 }
    
    
    private void jClaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jClaveActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jClaveActionPerformed

    private void jTextoPlanoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextoPlanoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_jTextoPlanoActionPerformed

    private void botonDesencriptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonDesencriptarActionPerformed
        DInicio p_desincriptado= new DInicio(clave,textocifradoTotal);
        intro.add(p_desincriptado,"DInicio");
        CardLayout cl = (CardLayout)(intro.getLayout());
        cl.show(intro,"DInicio");
        
        // TODO add your handling code here:
    }//GEN-LAST:event_botonDesencriptarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonDesencriptar;
    private javax.swing.JButton jButtonClave;
    private javax.swing.JTextField jClave;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextAreaResultado;
    private javax.swing.JTextField jTextoPlano;
    // End of variables declaration//GEN-END:variables
}
